package service

import (
	"chat_project/module"
	"errors"
	"time"
)

type ContactService struct {
}

func (ContactService) AddFriend(userid int64, dstid int64) error {
	// 处理添加好友
	if userid == dstid {
		return errors.New("不能添加自己为好友")
	}
	tmp := module.Contact{}
	err := errors.New("")
	// 查询是否已经是好友
	_, err = DBEngin.Where("dstobj=?", dstid).
		And("ownerid=?", userid).
		And("cate=?", module.CONCAT_CATE_USER).Get(&tmp)
	if err != nil {
		return errors.New("查询错误")
	}
	if tmp.Id > 0 {
		return errors.New("该用户已经被添加过")
	}
	// 事务处理
	session := DBEngin.NewSession()
	session.Begin()
	// 插入两条数据
	_, e2 := session.InsertOne(module.Contact{
		Ownerid:  userid,
		Dstobj:   dstid,
		Cate:     module.CONCAT_CATE_USER,
		Createat: time.Now(),
	})

	_, e3 := session.InsertOne(module.Contact{
		Ownerid:  dstid,
		Dstobj:   userid,
		Cate:     module.CONCAT_CATE_USER,
		Createat: time.Now(),
	})
	if e2 == nil && e3 == nil {
		session.Commit()
		return nil
	} else {
		session.Rollback()
		if e2 != nil {
			return e2
		} else {
			return e3
		}
	}
}

func (ContactService) SearchFriend(userid int64) []module.User {
	// 设置初始切片,动态扩容,此处不知道查出来数据多少条,因此使用切片比较好
	containers := make([]module.Contact, 0)
	objIds := make([]int64, 0)
	DBEngin.Where("ownerid=? and cate=?", userid, module.CONCAT_CATE_USER).Find(&containers)
	for _, v := range containers {
		objIds = append(objIds, v.Dstobj)
	}
	coms := make([]module.User, 0)
	if len(objIds) == 0 {
		return coms
	}
	DBEngin.In("id", objIds).Find(&coms)
	return coms

}
